001 /*
002 * Copyright 2004 Stephen J. McConnell.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.data;
020
021 import net.dpml.component.Directive;
022
023 /**
024 * A <code>FeatureDirective</code> declares a context entry that is itself a feature
025 * of the component including the component uri, name, working directory, or temporary
026 * directory.
027 *
028 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
029 * @version 1.0.0
030 */
031 public class FeatureDirective extends AbstractDirective implements Directive
032 {
033 /**
034 * Serial version identifier.
035 */
036 static final long serialVersionUID = 1L;
037
038 /**
039 * Constant identifier for the component name feature.
040 */
041 public static final int NAME = 0;
042
043 /**
044 * Constant identifier for the component uri feature.
045 */
046 public static final int URI = 1;
047
048 /**
049 * Constant identifier for the component working directory feature.
050 */
051 public static final int WORK = 2;
052
053 /**
054 * Constant identifier for the component temporary directory feature.
055 */
056 public static final int TEMP = 3;
057
058 /**
059 * Return the feature id givcen a supplied name.
060 * @param value the feature name
061 * @return the feature id
062 */
063 public static int getFeatureForName( String value )
064 {
065 if( "name".equals( value ) )
066 {
067 return NAME;
068 }
069 else if( "uri".equals( value ) )
070 {
071 return URI;
072 }
073 else if( "work".equals( value ) )
074 {
075 return WORK;
076 }
077 else if( "temp".equals( value ) )
078 {
079 return TEMP;
080 }
081 else
082 {
083 final String error =
084 "Feature not recognized [" + value + "].";
085 throw new IllegalArgumentException( error );
086 }
087 }
088
089 //--------------------------------------------------------------------------
090 // state
091 //--------------------------------------------------------------------------
092
093 private final String m_key;
094 private final int m_feature;
095
096 //--------------------------------------------------------------------------
097 // constructors
098 //--------------------------------------------------------------------------
099
100 /**
101 * Create a new feature directive.
102 * @param key the feature name
103 * @param feature the feasture id
104 */
105 public FeatureDirective( String key, int feature )
106 {
107 if( null == key )
108 {
109 throw new NullPointerException( "key" );
110 }
111 m_key = key;
112 m_feature = feature;
113 }
114
115 //--------------------------------------------------------------------------
116 // FeatureDirective
117 //--------------------------------------------------------------------------
118
119 /**
120 * Return the feature key.
121 * @return the feature key
122 */
123 public String getKey()
124 {
125 return m_key;
126 }
127
128 /**
129 * Return the feature id.
130 * @return the feature id
131 */
132 public int getFeature()
133 {
134 return m_feature;
135 }
136
137 /**
138 * Test if the supplied object is equal to this object.
139 * @param other the object to compare with this instance
140 * @return TRUE if the supplied object is equal to this object
141 */
142 public boolean equals( Object other )
143 {
144 if( null == other )
145 {
146 return false;
147 }
148 else
149 {
150 FeatureDirective feature = (FeatureDirective) other;
151 if( !m_key.equals( feature.getKey() ) )
152 {
153 return false;
154 }
155 else
156 {
157 return m_feature == feature.getFeature();
158 }
159 }
160 }
161
162 /**
163 * Return the hashcode for the instance.
164 * @return the instance hashcode
165 */
166 public int hashCode()
167 {
168 int hash = m_key.hashCode();
169 hash ^= m_feature;
170 return hash;
171 }
172 }